﻿using System;
using DDotNet.ORMapping.Attribute;
using DDotNet.ORMapping.Attribute.DirectAccess;
using DDotNet.ORMapping.OREntity;
using DDotNet.ORMapping.Validation;

namespace Agenda.Model.Entities
{
    /// <summary>
    /// Entidade que Representa um Único Endereço da Agenda
    /// </summary>
    [Serializable()]
    [DBMapping("MainDB")]
    [DirectEntityMapping("tb_EnderecoAgenda", AllowDelete = true, AllowInsert = true, AllowUpdate = true)]
    public sealed class EnderecoAgenda : BusinessEntityBase
    {
        #region Campos

        private int _ID;
        private int _IDValidacao;
        private int _IDRegistroAgenda;
        private string _Endereco;
        private string _Complemento;
        private string _Cidade;
        private string _Estado;
        private string _Bairro;
        private string _CEP;

        #endregion

        #region Propriedades

        /// <summary>
        /// Retorna o ID (Chave Primária) do Endereço da Agenda
        /// </summary>
        [EntityPrimaryKey(true)]
        [PropertyMapping("IDEnderecoAgenda")]
        public int ID
        {
            get { return _ID; }
            set
            {
                _ID = value;
                this.MarkDirty("ID");
            }
        }

        /// <summary>
        /// Contém a Referência para a Chave Estrangeira que Identifica o Registro da Agenda a Qual este Endereço Pertence
        /// </summary>
        [EntityForeignKey("ID")]
        [PropertyMapping("IDRegistroAgenda")]
        public int IDRegistroAgenda
        {
            get { return _IDRegistroAgenda; }
            set
            {
                _IDRegistroAgenda = value;
                this.MarkDirty("IDRegistroAgenda");
            }
        }

        /// <summary>
        /// Chave Estrangeira da Entidade de Telefone para Indicar qual o ID da Validação do Registro de Agenda que esta Entidade Pertence
        /// </summary>
        [EntityForeignKey("IDValidacao")]
        [PropertyMapping("IDValidacao")]
        public int IDValidacao
        {
            get { return _IDValidacao; }
            set
            {
                _IDValidacao = value;
                base.MarkDirty("IDValidacao");
            }
        }

        /// <summary>
        /// Contém o Endereço
        /// </summary>
        [PropertyMapping("Endereco")]
        public string Endereco
        {
            get { return _Endereco; }
            set
            {
                _Endereco = value;
                this.MarkDirty("Endereco");
            }
        }

        /// <summary>
        /// Contém o Complemento do Endereço
        /// </summary>
        [PropertyMapping("Complemento", AllowNull = true, NullValue = "")]
        public string Complemento
        {
            get { return _Complemento; }
            set
            {
                _Complemento = value;
                this.MarkDirty("Complemento");
            }
        }

        /// <summary>
        /// Contém a Cidade do Endereço
        /// </summary>
        [PropertyMapping("Cidade")]
        public string Cidade
        {
            get { return _Cidade; }
            set
            {
                _Cidade = value;
                this.MarkDirty("Cidade");
            }
        }

        /// <summary>
        /// Contém o Estado do Endereço
        /// </summary>
        [PropertyMapping("Estado")]
        public string Estado
        {
            get { return _Estado; }
            set
            {
                _Estado = value;
                this.MarkDirty("Estado");
            }
        }

        /// <summary>
        /// Contém o Bairro do Endereço
        /// </summary>
        [PropertyMapping("Bairro")]
        public string Bairro
        {
            get { return _Bairro; }
            set
            {
                _Bairro = value;
                this.MarkDirty("Bairro");
            }
        }

        /// <summary>
        /// Contém o Cep do Endereço
        /// </summary>
        [PropertyMapping("CEP")]
        public string CEP
        {
            get { return _CEP; }
            set
            {
                _CEP = value;
                this.MarkDirty("CEP");
            }
        }

        #endregion

        /// <summary>
        /// Adiciona as Regras de Validação na Entidade
        /// </summary>
        protected override void AddValidationRules()
        {
            // Adiciona Validações de Endereço
            base.Validations.Add(
                new ValidationRule("Endereco.Requirido", "Endereco",
                                   "O Endereço deve ser Preenchido",
                                   new ValidationRuleHandler(CommonRules.Instance.StringRequired)));

            base.Validations.Add(
                new ValidationRule("Endereco.Tamanho", "Endereco",
                                   "O Endereço deve conter até 50 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(50)));


            // Adiciona Validações de Complemento
            base.Validations.Add(
                new ValidationRule("Complemento.Tamanho", "Complemento",
                                   "O Complemento do Endereço deve conter até 50 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(50)));


            // Adiciona Validações de Cidade
            base.Validations.Add(
                new ValidationRule("Cidade.Requirido", "Cidade",
                                   "A Cidade deve ser Preenchido",
                                   new ValidationRuleHandler(CommonRules.Instance.StringRequired)));

            base.Validations.Add(
                new ValidationRule("Cidade.Tamanho", "Cidade",
                                   "A Cidade deve conter até 40 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(40)));


            // Adiciona Validações de Estado
            base.Validations.Add(
                new ValidationRule("Estado.Requirido", "Estado",
                                   "O Estado deve ser Preenchido",
                                   new ValidationRuleHandler(CommonRules.Instance.StringRequired)));

            base.Validations.Add(
                new ValidationRule("Estado.Tamanho", "Estado",
                                   "O Estado deve conter até 2 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(2)));


            // Adiciona Validações de Bairro
            base.Validations.Add(
                new ValidationRule("Bairro.Requirido", "Bairro",
                                   "O Bairro deve ser Preenchido",
                                   new ValidationRuleHandler(CommonRules.Instance.StringRequired)));

            base.Validations.Add(
                new ValidationRule("Bairro.Tamanho", "Estado",
                                   "O Bairro deve conter até 30 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(30)));


            // Adiciona Validações de CEP
            base.Validations.Add(
                new ValidationRule("CEP.Requirido", "CEP",
                                   "O Cep deve ser Preenchido",
                                   new ValidationRuleHandler(CommonRules.Instance.StringRequired)));

            base.Validations.Add(
                new ValidationRule("CEP.Tamanho", "CEP",
                                   "O Cep deve conter até 8 dígitos",
                                   new ValidationRuleHandler(CommonRules.Instance.StringMaxLength),
                                   new StringMaxLengthArgs(8)));
        }
    }
}